package br.com.conveito.service;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import br.com.conceito.dao.ArquivoDAO;
import br.com.conceito.dao.ArvoreDAO;
import br.com.conceito.dao.FabricaDAO;
import br.com.conveito.entidade.Arquivo;

public class ArquivoServico {

	public static void criarEstruturaDeArquivoFisicoLicitacao(final String nomeLicitacao){
		ArvoreDAO arvoreDAO = new ArvoreDAO();
		ArquivoDAO arquivoDAO = new ArquivoDAO();
		List<Integer> idsNo = arvoreDAO.obtemTodosNos();
		for(Integer no : idsNo){
			String caminho = arquivoDAO.carregarCaminhoProfundidadeNoPai(no);
			File caminhoCompleto = new File("c://"+nomeLicitacao+caminho);
			caminhoCompleto.mkdirs();
		}
	}
	
	public static String carregarCaminhoCompletoDoNoPai(final Integer idNo){
		ArquivoDAO arquivoDAO = new ArquivoDAO();
		return arquivoDAO.carregarCaminhoProfundidadeNoPai(idNo);
	}
	
	public static synchronized void salvarArquivo(InputStream in,
			String destino, Arquivo arquivo) {
		ArquivoDAO arquivoDAO = new ArquivoDAO();
		Connection connection = null;
		try {
			connection = FabricaDAO.getInstancia().getConection();
			connection.setAutoCommit(false);
			arquivoDAO.salvar(arquivo, connection);
			// TODO OBTER NOME COMPLETO (CAMINHO + NOME) DIRETO DO OBJETO ARQUIVO
			OutputStream out = new FileOutputStream(new File(destino
					+ arquivo.getNome()));
			int read = 0;
			byte[] bytes = new byte[1024];
			while ((read = in.read(bytes)) != -1) {
				out.write(bytes, 0, read);
			}
			in.close();
			out.flush();
			out.close();
			connection.commit();
			connection.setAutoCommit(true);
		} catch (IOException e) {
			try {
				connection.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			try {
				connection.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}

}
